package com.itheima.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.PageVo;
import com.itheima.Result;
import com.itheima.admin.dto.ModuleDto;
import com.itheima.admin.dto.PageModuleDto;
import com.itheima.admin.mapper.ModuleMapper;
import com.itheima.admin.mapper.RoleMapper;
import com.itheima.admin.pojo.Module;
import com.itheima.admin.pojo.Role;
import com.itheima.admin.service.ModuleService;
import com.itheima.admin.vo.ModulePageVo;
import com.itheima.admin.vo.ModuleVo;
import com.itheima.admin.vo.ModuleVo2;
import com.itheima.admin.vo.RoleVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @ClassName ModuleServiceImpl
 * @Description TODO
 * @Author Mister-Lu
 * @Date 2021/12/17
 **/
@Service
public class ModuleServiceImpl implements ModuleService {
    @Autowired
    private ModuleMapper moduleMapper;
    @Autowired
    private RoleMapper roleMapper;

    @Override
    public ModuleVo queryModuleById(String id) {
        Module module = moduleMapper.selectById(id);
        ModuleVo moduleVo = new ModuleVo();
        BeanUtils.copyProperties(module,moduleVo);
        return moduleVo;
    }

    @Override
    public Result addModule(ModuleVo moduleVo) {
        Module module =new Module();
        BeanUtils.copyProperties(module,moduleVo);
        int rs = moduleMapper.insert(module);

        return new Result(rs>0, rs>0 ? "修改模块成功" : "修改模块失败", null);
    }

    @Override
    public PageVo<ModulePageVo> queryModulePage(PageModuleDto pageModuleDto) {

        IPage<Module> page = new Page(pageModuleDto.getCurrentPage(),pageModuleDto.getPageSize());
        QueryWrapper<Module> queryWrapper=new QueryWrapper<>();
        if(pageModuleDto.getQueryString()!=null){
            queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("ctype",pageModuleDto.getCtype());
            queryWrapper.like("name",pageModuleDto.getQueryString());
        }
        IPage<Module> moduleIPage = moduleMapper.selectPage(page,queryWrapper);

        List<ModulePageVo> collect = moduleIPage.getRecords().stream().map(
                module -> {
                    ModulePageVo modulePageVo = new ModulePageVo();
                    BeanUtils.copyProperties(module, modulePageVo);
                    return modulePageVo;
                }
        ).collect(Collectors.toList());
            return new PageVo<>(collect, (int) moduleIPage.getTotal());
    }

    private List<ModuleDto> getModuleDto(List<Module> moduleIPage) {
        if(moduleIPage==null){
            return new ArrayList<>();
        }
        return moduleIPage.stream().map(
                module -> {
                    ModuleDto moduleDto = new ModuleDto();
                    BeanUtils.copyProperties(module, moduleDto);
                    return moduleDto;
                }
        ).collect(Collectors.toList());
    }

    @Override
    public List<ModuleDto> queryAllModules() {
        List<Module> modules = moduleMapper.selectList(null);
        return getModuleDto(modules);
    }

    @Override
    public Result add(ModuleDto moduleDto) {
        Module module =new Module();
        BeanUtils.copyProperties(module,moduleDto);
        int rs = moduleMapper.insert(module);
        return new Result(rs>0, rs>0 ? "添加模块成功" : "添加模块失败", null);
    }

    @Override
    public Result deleteModuleById(String id) {
        roleMapper.deleteRoleModule(id);
        int rs = moduleMapper.deleteById(id);
        return new Result(rs>0, rs>0 ? "删除模块成功" : "删除模块失败", null);
    }

    @Override
    public Result updateModule(ModuleVo moduleVo) {
        Module module = new Module();
        BeanUtils.copyProperties(moduleVo,module);
        int rs =  moduleMapper.updateById(module);
        return new Result(rs>0, rs>0 ? "修改模块成功" : "修改模块失败", null);
    }

    @Override
    public List<ModuleVo2> queryMenuList() {

        return null;
    }



}
